package com.common.base.app.extras

import android.text.TextUtils
import android.view.View
import com.common.base.utils.RxHelper
import com.common.base.utils.ValidateIdCardUtils.validateCard
import io.reactivex.rxjava3.disposables.Disposable
import java.util.*
import java.util.regex.Pattern

/**
 * 最上层公共代码Kotlin抽离调用
 */

/** 检查不为空 */
fun checkNotNull(any: Any?): Boolean {
    return any != null
}

/** 文字是否是空的 */
fun isEmpty(text: String?): Boolean {
    return TextUtils.isEmpty(text)
}

/** 文字不是空的 */
fun isNotEmpty(text: String?): Boolean {
    return !isEmpty(text)
}

/** 运行在主线程 */
fun doOnUiThread(func: () -> Unit) {
    RxHelper.doOnUiThread { func.invoke() }
}

/** 运行在子线程 */
fun doOnIOThread(func: () -> Unit) {
    RxHelper.doOnIOThread { func.invoke() }
}

/** 运行在子线程 */
fun doOnIOThread(func: () -> Unit, onComplete: (() -> Unit)? = null) {
    RxHelper.doOnIOThread(func, onComplete)
}

/** 运行在新线程 */
fun doOnNewThread(func: () -> Unit) {
    RxHelper.doOnNewThread { func.invoke() }
}

/** 运行在新线程 */
fun doOnNewThread(func: () -> Unit, onComplete: (() -> Unit)? = null) {
    RxHelper.doOnNewThread(func, onComplete)
}

/** 运行在新线程并返回结果 */
fun <T : Any> doOnNewThreadWithResult(task: () -> T, onComplete: ((T) -> Unit)? = null) {
    RxHelper.doOnNewThreadWithResult(task, onComplete)
}

/** Post到主线程 */
fun post(task: () -> Unit) {
    doOnUiThread { task.invoke() }
}

/** Post到主线程 */
fun postDelay(time: Long, task: () -> Unit) {
    RxHelper.doDelay(time) { task.invoke() }
}


/** Post到子线程 */
fun postIoDelay(time: Long, task: () -> Unit) {
    RxHelper.doDelayOnIOThread(time) { task.invoke() }
}

/**
 * 根据Boolean值返回对应的值
 */
fun <R> Boolean.judgeReturn(trueObj: R, falseObj: R): R {
    return if (this) trueObj else falseObj
}

/**
 * Boolean转Int true: 1 false: 0
 */
fun Boolean.toInt(): Int {
    return this.judgeReturn(1, 0)
}

/**
 * 正则  全部匹配
 */
fun String.isMatchReg(reg: String?): Boolean {
    if (this.isNullOrEmpty() || reg.isNullOrEmpty()) {
        return false
    }
    return Pattern.compile(reg).matcher(this).matches()
}

/**
 * 正则 部分匹配
 */
fun String.hasMatchPart(reg: String): Boolean {
    if (this.isNullOrEmpty() || reg.isNullOrEmpty()) {
        return false
    }
    val matcher = Pattern.compile(reg).matcher(this)
    var count = 0
    while (matcher.find()) {
        count++
    }
    return count > 0
}

/**
 * 解决textView ellipsize属性无效的问题 根据限制长度截取
 */
fun String.getEllipsizeText(length: Int): String {
    if (this.isNullOrEmpty() || this.length <= length) {
        return this
    }
    return this.substring(0, length) + "..."
}

/**
 * 获取view在窗口的x坐标
 */
fun View.getLocationXInWindow(): Int {
    var x = 0
    this.let {
        val location = IntArray(2)
        it.getLocationInWindow(location)
        x = location[0]
    }
    return x
}

/**
 * 获取view在窗口的y坐标
 */
fun View.getLocationYInWindow(): Int {
    var y = 0
    this.let {
        val location = IntArray(2)
        it.getLocationInWindow(location)
        y = location[1]
    }
    return y
}

/**
 * 检查姓名是否满足4-20个字符 即 2 - 10个汉字
 */
fun String.isMatchRealNameFormat(): Boolean {
    if (this.isNullOrEmpty())
        return false
    val pattern = "^[\\u4e00-\\u9fa5]{2,10}$"
    return Pattern.compile(pattern).matcher(this).matches()
}

/**
 * 检查身份证号格式是否正确
 */
fun String.isMatchIDFormat(): Boolean {
    if (this.isNullOrEmpty())
        return false
//    val pattern = "^\\d{6}(18|19|20)?\\d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])\\d{3}[0-9Xx]\$"
//    return Pattern.compile(pattern).matcher(this).matches()
    //大陆身份证校验
    return validateCard(this.uppercase(Locale.ROOT))
}